package org.m8.auth.model;

import com.querydsl.core.types.Projections;
import com.querydsl.core.types.QBean;
import com.querydsl.sql.SQLQueryFactory;
import org.m8.auth.model.qentity.QOauth2AccessToken;
import org.m8.dba.config.SQLQueryFactoryManager;
import org.m8.dba.transaction.M8Transactional;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * dao
 *
 * @author yidanjun
 * @date 2024/9/4
 **/
@M8Transactional
@Component
public class OAuth2AccessTokenDao {

    public final QBean<OAuth2AccessTokenDO> oAuth2AccessTokenDOQBean = Projections.bean(OAuth2AccessTokenDO.class, QOauth2AccessToken.m8Oauth2AccessToken.all());

    public OAuth2AccessTokenDO getByAccessToken(String accessToken) {
        return SQLQueryFactoryManager.getQueryFactory().select(oAuth2AccessTokenDOQBean)
                .from(QOauth2AccessToken.m8Oauth2AccessToken)
                .where(QOauth2AccessToken.m8Oauth2AccessToken.accessToken.eq(accessToken))
                .fetchOne();
    }
    /**
     * 根据refreshToken查询
     */
    public List<OAuth2AccessTokenDO> getByRefreshToken(String refreshToken) {
        return SQLQueryFactoryManager.getQueryFactory().select(oAuth2AccessTokenDOQBean)
                .from(QOauth2AccessToken.m8Oauth2AccessToken)
                .where(QOauth2AccessToken.m8Oauth2AccessToken.refreshToken.eq(refreshToken))
                .fetch();
    }

    /**
     * 新增
     */
    public long insert(OAuth2AccessTokenDO oAuth2AccessTokenDO) {
        SQLQueryFactory sqlQueryFactory = SQLQueryFactoryManager.getQueryFactory();
        return sqlQueryFactory.insert(QOauth2AccessToken.m8Oauth2AccessToken)
                .populate(oAuth2AccessTokenDO)
                .execute();
    }

    /**
     * 根据accessToken删除
     */
    public long deleteByAccessToken(String accessToken) {
        return SQLQueryFactoryManager.getQueryFactory().delete(QOauth2AccessToken.m8Oauth2AccessToken)
                .where(QOauth2AccessToken.m8Oauth2AccessToken.accessToken.eq(accessToken))
                .execute();
    }

    /**
     * 根据id列表批量删除
     */
    public long deleteByIds(List<String> ids) {
        return SQLQueryFactoryManager.getQueryFactory().delete(QOauth2AccessToken.m8Oauth2AccessToken)
                .where(QOauth2AccessToken.m8Oauth2AccessToken.id.in(ids))
                .execute();
    }
}
